import pymysql


class MySQLUtil:
    def __init__(self, host, user, password, database, port=3307, charset='utf8mb4'):
        """
        初始化 MySQLUtil 类。
        :param host: MySQL 服务器的主机地址。
        :param user: 用户名。
        :param password: 密码。
        :param database: 要连接的数据库名称。
        :param port: MySQL 服务器的端口，默认为 3307。
        :param charset: 字符集，默认为 'utf8mb4'。
        """
        self.host = host
        self.user = user
        self.password = password
        self.database = database
        self.port = port
        self.charset = charset
        self.connection = None
        self.cursor = None

    def connect(self):
        """
        连接到 MySQL 数据库。
        :return: True 表示连接成功
        """
        try:
            self.connection = pymysql.connect(
                host=self.host,
                user=self.user,
                password=self.password,
                database=self.database,
                port=self.port,
                charset=self.charset
            )
            self.cursor = self.connection.cursor(pymysql.cursors.DictCursor)
            print("成功连接到 MySQL 数据库。")
            return True
        except pymysql.MySQLError as e:
            print(f"连接 MySQL 时出错: {e}")
            raise e

    def execute_query(self, query, params=None):
        """
        执行查询语句。
        :param query: SQL 语句。
        :param params: 查询参数，默认为 None。
        :return: 查询结果集，如果执行失败返回 None。
        """
        if not self.connection:
            print("未连接到数据库，请先连接。")
            return None
        try:
            if params:
                self.cursor.execute(query, params)
            else:
                self.cursor.execute(query)
            return self.cursor.fetchall()
        except pymysql.MySQLError as e:
            print(f"执行查询时出错: {e}")
            raise e

    def execute_insert(self, query, params=None):
        """
        执行插入语句。
        :param query: SQL 插入语句。
        :param params: 插入参数，默认为 None。
        :return: 插入后的自增 ID，如果执行失败返回 None。
        """
        if not self.connection:
            print("未连接到数据库，请先连接。")
            return None
        try:
            if params:
                self.cursor.execute(query, params)
            else:
                self.cursor.execute(query)
            self.connection.commit()
            print("新增成功,新增数据的ID为：", self.cursor.lastrowid)
            return True
        except pymysql.MySQLError as e:
            print(f"执行插入时出错: {e}")
            raise e

    def execute_update(self, query, params=None):
        """
        执行更新或删除语句。
        :param query: SQL 更新或删除语句。
        :param params: 更新或删除参数，默认为 None。
        :return: 受影响的行数，如果执行失败返回 None。
        """
        if not self.connection:
            print("未连接到数据库，请先连接。")
            return None
        try:
            if params:
                self.cursor.execute(query, params)
            else:
                self.cursor.execute(query)
            self.connection.commit()
            print("更新成功,受影响的行数：", self.cursor.rowcount)
            return True
        except pymysql.MySQLError as e:
            print(f"执行更新或删除时出错: {e}")
            raise e

    def close(self):
        """
        关闭数据库连接。
        """
        if self.cursor:
            self.cursor.close()
        if self.connection:
            self.connection.close()
            print("已关闭 MySQL 数据库连接。")


# 以下是使用示例
if __name__ == "__main__":
    # 实例化 MySQLTool 类
    mysql_tool = MySQLUtil(host="192.168.10.10", user="root", password="123456", database="saas_back", port=3307)
    # 连接到数据库
    if mysql_tool.connect():
        # 执行查询
        # sql = "SELECT * FROM users limit 10 ;"
        # sql = "INSERT INTO users (id,user_account, user_name) VALUES (3,'xj002', '张三');"
        sql = "DELETE FROM users WHERE id = 3;"
        result = mysql_tool.execute_update(sql)
        if result:
            print(result)

        # # 执行插入
        # insert_query = "INSERT INTO users (name, age) VALUES (%s, %s)"
        # insert_params = ("John", 30)
        # insert_id = mysql_tool.execute_insert(insert_query, insert_params)
        # if insert_id:
        #     print(f"插入成功，自增 ID 为: {insert_id}")
        #
        # # 执行更新
        # update_query = "UPDATE users SET age = %s WHERE name = %s"
        # update_params = (31, "John")
        # affected_rows = mysql_tool.execute_update(update_query, update_params)
        # if affected_rows:
        #     print(f"更新成功，影响行数: {affected_rows}")

        # 关闭连接
        mysql_tool.close()
